import socket
import json
from datetime import datetime


def read_server_variables():
    """读取服务端所有变量的当前值及描述信息"""
    server_ip = '127.0.0.1'
    server_port = 18787
    s = None  # 初始化socket变量

    try:
        # 创建TCP socket并连接服务器
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((server_ip, server_port))
        print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]}] 已连接服务器 {server_ip}:{server_port}")

        # 构建READ模式的JSON指令，仅需指定mode为READ
        request_data = {"mode": "READ"}
        request_json = json.dumps(request_data)
        s.sendall(request_json.encode('utf-8'))
        print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]}] 已发送读取请求: {request_json}")

        # 接收服务端响应并解析
        response = s.recv(1024)
        if response:
            try:
                # 尝试用utf-8解码，若失败再尝试GBK
                try:
                    response_str = response.decode('utf-8')
                except UnicodeDecodeError:
                    response_str = response.decode('GBK')

                # 解析JSON响应
                response_json = json.loads(response_str)
                print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]}] 服务端变量读取结果:")
                # 使用get方法安全获取键值，避免KeyError
                print(
                    f"  技能类型: {response_json.get('skill_type', '未知')} ({response_json.get('skill_type_desc', '无描述')})")
                print(
                    f"  终止状态: {response_json.get('terminate_status', '未知')} ({response_json.get('terminate_status_desc', '无描述')})")
                print(
                    f"  鼠标状态: {response_json.get('mouse_status', '未知')} ({response_json.get('mouse_status_desc', '无描述')})")
                print(f"  读取状态: {response_json.get('status', '未知')}")
            except UnicodeDecodeError:
                print(
                    f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]}] 服务端响应解码失败，原始数据: {response}")
            except json.JSONDecodeError:
                print(
                    f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]}] 服务端响应格式错误，无法解析为JSON: {response_str}")
        else:
            print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]}] 未收到服务端响应")

    except ConnectionRefusedError:
        print(
            f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]}] 无法连接到服务器 {server_ip}:{server_port}，请先启动服务端")
    except socket.timeout:
        print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]}] 连接服务器超时")
    except socket.error as e:
        print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]}] 网络错误: {str(e)}")
    except Exception as e:
        print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]}] 发生错误: {str(e)}")
    finally:
        # 确保socket资源被释放
        if s:
            try:
                s.close()
                print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]}] 已关闭与服务器的连接")
            except Exception as e:
                print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]}] 关闭连接时发生错误: {str(e)}")
        print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]}] 读取操作完成\n")


# 直接执行读取操作
if __name__ == "__main__":
    # 注意：原代码中的循环次数过大，可能导致系统资源耗尽，这里调整为较小的次数
    for i in range(1, 1000000):  # 修改为10次循环，可根据需要调整
        read_server_variables()
